import { ElMessage } from 'element-plus'

// export function copyToClipboard(str: string) {
//     // 创建一个临时的 textarea 元素
//     const el = document.createElement('textarea');
//     // 设置 textarea 的值为传入的字符串
//     el.value = str;
//     // 将 textarea 元素添加到 DOM 中
//     document.body.appendChild(el);
//     // 选中 textarea 中的文本
//     el.select();
//     // 执行浏览器的复制命令
//     document.execCommand('copy');
//     // 移除 textarea 元素
//     document.body.removeChild(el);
// }

/** 传入字符串复制到剪切板 */
export const copyToClipboard = async (text: string) => {
    if (navigator.clipboard && navigator.permissions) {
        await navigator.clipboard.writeText(text)
    } else {
        const textareaEl = document.createElement('textarea')
        textareaEl.setAttribute('readonly', 'readonly') // 防止手机上弹出软键盘
        textareaEl.value = text
        document.body.appendChild(textareaEl)
        textareaEl.select()
        const res = document.execCommand('copy')
        document.body.removeChild(textareaEl)
    }
    ElMessage({
        message: '复制成功',
        type: 'success',
        offset: 80
    })
}

function getFileNameFromUrl(url: string): string {
    return url.substring(url.lastIndexOf('/') + 1)
}

/** 传入一个url，下载文件 */
export function downloadFile(url: string): void {
    fetch(url)
        .then(response => response.blob())
        .then(blob => {
            const blobUrl = window.URL.createObjectURL(blob)
            const a = document.createElement('a')
            a.href = blobUrl
            // 获取文件名
            const fileName = getFileNameFromUrl(url)
            a.download = fileName
            document.body.appendChild(a)
            a.click()
            setTimeout(() => {
                document.body.removeChild(a)
                window.URL.revokeObjectURL(blobUrl)
            }, 0)
        })
        .catch(error => console.error('Error downloading file:', error))
}

export function secondsToMinutes(seconds: number): string {
    const minutes = Math.floor(seconds / 60);
    const remainingSeconds = Math.floor(seconds % 60);

    const minutesStr = String(minutes).padStart(2, '0');
    const secondsStr = String(remainingSeconds).padStart(2, '0');

    return `${minutesStr}:${secondsStr}`;
}

/** 函数将接受两个日期字符串和一个分钟数，判断两个时间之间的差异是否超过指定的分钟数，并返回相应的布尔值 */
export function areTimesWithinNMinutes(time1: string, time2: string, n: number): boolean {
    // 将日期字符串转换为 Date 对象
    const date1: any = new Date(time1.replace(/-/g, '/'));
    const date2: any = new Date(time2.replace(/-/g, '/'));

    // 计算两个日期之间的差值（毫秒）
    const differenceInMillis = Math.abs(date2 - date1);

    // 转换分钟数为毫秒
    const nMinutesInMillis = n * 60 * 1000;

    // 判断差值是否超过指定的分钟数
    return differenceInMillis <= nMinutesInMillis;
}


// 根据当前时间返回 "1970-01-01 00:00:00" 格式的日期时间字符串
export function getCurrentDateTime() {
    const now = new Date()
    const year = now.getFullYear()
    const month = String(now.getMonth() + 1).padStart(2, '0')
    const day = String(now.getDate()).padStart(2, '0')
    const hours = String(now.getHours()).padStart(2, '0')
    const minutes = String(now.getMinutes()).padStart(2, '0')
    const seconds = String(now.getSeconds()).padStart(2, '0')
    return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`
}

// 将传入的日期字符串转换为相对时间的格式，如“n分钟前”、“n小时前”、“n天前”、“n个月前”、“n年前”
export function timeAgo(dateString: string): string {
    const now: any = new Date()
    const then: any = new Date(dateString)
    // 计算时间差（毫秒）
    const diff = now - then
    // 转换时间差为秒
    const seconds = Math.floor(diff / 1000)
    // 转换时间差为分钟
    const minutes = Math.floor(seconds / 60)
    // 转换时间差为小时
    const hours = Math.floor(minutes / 60)
    // 转换时间差为天
    const days = Math.floor(hours / 24)
    // 转换时间差为月（粗略估算，考虑到月份天数不均匀）
    const months = Math.floor(days / 30)
    // 转换时间差为年（粗略估算，考虑到年份天数不均匀）
    const years = Math.floor(days / 365)
    // 返回合适的时间描述
    if (years > 0) {
        return years === 1 ? '1 年前' : `${years} 年前`
    } else if (months > 0) {
        return months === 1 ? '1 月前' : `${months} 月前`
    } else if (days > 0) {
        return days === 1 ? '1 天前' : `${days} 天前`
    } else if (hours > 0) {
        return hours === 1 ? '1 小时前' : `${hours} 小时前`
    } else if (minutes > 0) {
        return minutes === 1 ? '1 分钟前' : `${minutes} 分钟前`
    } else {
        return seconds === 1 ? '1 秒前' : `${seconds} 秒前`
    }
}

/** 它接收一个毫秒时间戳作为参数，并返回相对时间（如“n分钟前”、“n小时前”等） */
export function timeAgoFromTimestamp(timestamp: number): string {
    // 将秒级时间戳转换为毫秒级时间戳
    const now: any = new Date();
    const then: any = new Date(timestamp * 1000);

    // 计算时间差（毫秒）
    const diff = now - then;

    // 转换时间差为秒
    const seconds = Math.floor(diff / 1000);

    // 转换时间差为分钟
    const minutes = Math.floor(seconds / 60);

    // 转换时间差为小时
    const hours = Math.floor(minutes / 60);

    // 转换时间差为天
    const days = Math.floor(hours / 24);

    // 转换时间差为月（粗略估算，考虑到月份天数不均匀）
    const months = Math.floor(days / 30);

    // 转换时间差为年（粗略估算，考虑到年份天数不均匀）
    const years = Math.floor(days / 365);

    // 返回合适的时间描述
    if (years > 0) {
        return years === 1 ? '1 年前' : `${years} 年前`;
    } else if (months > 0) {
        return months === 1 ? '1 月前' : `${months} 月前`;
    } else if (days > 0) {
        return days === 1 ? '1 天前' : `${days} 天前`;
    } else if (hours > 0) {
        return hours === 1 ? '1 小时前' : `${hours} 小时前`;
    } else if (minutes > 0) {
        return minutes === 1 ? '1 分钟前' : `${minutes} 分钟前`;
    } else {
        return seconds === 1 ? '1 秒前' : `${seconds} 秒前`;
    }
}

/** 首字母大写 */
export function capitalizeFirstLetter(str: string): string {
    if (typeof str !== 'string' || str.length === 0) {
        return str
    }
    return str.charAt(0).toUpperCase() + str.slice(1)
}

/** 获取当前时间，并格式化为“时:分”的形式 */
export function getCurrentTime(): string {
    const now = new Date();
    const hours = String(now.getHours()).padStart(2, '0'); // 获取小时并补零
    const minutes = String(now.getMinutes()).padStart(2, '0'); // 获取分钟并补零
    const seconds = String(now.getSeconds()).padStart(2, '0'); // 获取秒并补零
    return `${hours}:${minutes}:${seconds}`; // 返回格式化后的时间
}

export function replaceCommaWithDash(input: string | undefined): string | undefined {
    if (!input) return
    return input.replace(/,/g, '-');
}

/** url转换未blob */
export async function urlToFile(url: any, filename: any) {
    const response = await fetch(url);
    const blob = await response.blob();
    const file = new File([blob], filename, { type: blob.type })

    return URL.createObjectURL(file)
}
